#pragma once
#include <iostream>

template <class T, int size> class MyStack
{
	T m_ar[size];
	size_t exist;

public:
	inline MyStack():exist(0) {};// ���������� exist = 0
	T& operator[](int);
	void Push(const T&);
	T Pop();

	void Print();
		//3.������������� ���������� �� ������ �������� "push" � "pop".���
		//			����, ����� ������������� ���������� ���������� ���� �������� 
		//			������ ���� �� ������������ ���������� � ��������� ��������
	//friend std::ostream& operator<<(std::ostream& os, const MyStack& stack);
};


//������������ ����� ������/�������� �������� ������ ��� ���������, ������� �� ����������
template <class T, int size> 
inline T& MyStack <T, size>::operator[] (int i)
{
	if (i >= 0 && i < exist)
	{
		return m_ar[i];
	}
	else throw std::logic_error("Data isn't exist");
}

template<class T, int size>
inline void MyStack<T, size>::Push(const T& addable)
{
	if (exist < size)
	{
		m_ar[exist] = addable;
		exist++;
	}
	else throw std::logic_error("overflow stack");
}

template<class T, int size>
inline T MyStack<T, size>::Pop()
{
	if (exist > 0)
	{
		exist--;
		return m_ar[exist];//� �������???	
	}
	else
	throw std::logic_error("empty stack");
}

template<class T, int size>
inline void MyStack<T, size>::Print()
{
	if (!exist) { std::cout << "empty stack" << std::endl; }

	for (int i = 0; i < exist; i++)
	{
		std::cout << m_ar[i]<<std::endl;
	}
	std::cout << std::endl;
}
